package com.leyou.item.service;

import com.leyou.common.enums.ExceptionEnum;
import com.leyou.common.exceptions.LyException;
import com.leyou.common.utils.BeanHelper;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpecParamDTO;
import com.leyou.item.entity.SpecGroup;
import com.leyou.item.entity.SpecParam;
import com.leyou.item.mapper.SpecGroupMapper;
import com.leyou.item.mapper.SpecParamMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author 虎哥
 */
@Service
public class SpecService {

    @Autowired
    private SpecGroupMapper groupMapper;

    @Autowired
    private SpecParamMapper paramMapper;

    public List<SpecGroupDTO> querySpecGroupByCategoryId(Long id) {
        // 创建查询条件，分类的id
        SpecGroup record = new SpecGroup();
        record.setCid(id);
        List<SpecGroup> list = groupMapper.select(record);
        // 非空判断
        if (CollectionUtils.isEmpty(list)) {
            throw new LyException(ExceptionEnum.SPEC_NOT_FOUND);
        }
        // 转换并返回
        return BeanHelper.copyWithCollection(list, SpecGroupDTO.class);
    }

    public List<SpecParamDTO> queryParams(Long gid, Long cid, Boolean searching) {
        // 不允许所有条件都为空
        if (gid == null && cid == null && searching == null) {
            throw new LyException(ExceptionEnum.INVALID_PARAM_ERROR);
        }

        // 创建查询条件
        SpecParam record = new SpecParam();
        record.setGroupId(gid);
        record.setCid(cid);
        record.setSearching(searching);

        // 根据对象中的非空字段来查询
        List<SpecParam> list = paramMapper.select(record);
        // 非空判断
        if (CollectionUtils.isEmpty(list)) {
            throw new LyException(ExceptionEnum.SPEC_NOT_FOUND);
        }
        // 转换并返回
        return BeanHelper.copyWithCollection(list, SpecParamDTO.class);
    }

    public List<SpecGroupDTO> querySpecs(Long cid) {
        // 查询规格组
        List<SpecGroupDTO> groupList = querySpecGroupByCategoryId(cid);

        // 查询分类下的所有参数
        List<SpecParamDTO> specParams = queryParams(null, cid, null);

        // 对specParams根据groupId分组，得到map，key是groupId, value是groupId一致的specParam的集合
//        Map<Long, List<SpecParamDTO>> map = new HashMap<>();
//        for (SpecParamDTO specParam : specParams) {
//            if(!map.containsKey(specParam.getGroupId())){
//                // param是改组的第一个，需要创建新的列表
//                map.put(specParam.getGroupId(), new ArrayList<>());
//            }
//            // 将当前param加入列表
//            map.get(specParam.getGroupId()).add(specParam);
//        }

        Map<Long, List<SpecParamDTO>> map = specParams.stream().collect(Collectors.groupingBy(SpecParamDTO::getGroupId));
        // 往组内放
        for (SpecGroupDTO groupDTO : groupList) {
            groupDTO.setParams(map.get(groupDTO.getId()));
        }

//        for (SpecGroupDTO group : groupList) {
//            group.setParams(new ArrayList<>());
//            for (SpecParamDTO param : specParams) {
//                Long groupId = param.getGroupId();
//                if(group.getId() == groupId){
//                    group.getParams().add(param);
//                }
//            }
//        }


        // 查询组内参数
//        for (SpecGroupDTO groupDTO : groupList) {
//            List<SpecParamDTO> params = queryParams(groupDTO.getId(), null, null);
//            groupDTO.setParams(params);
//        }
        return groupList;
    }
}
